package book.nettyinaction.ch04;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.util.CharsetUtil;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 代码清单 4-6 从多个线程使用同一个 Channel
 *
 * Netty 的 Channel 实现是线程安全的，因此你可以存储一个到 Channel 的引用，
 * 并且每当你需要向远程节点写数据时，都可以使用它，即使当时许多线程都在使用它。
 *
 * 需要注意的是，消息将会被保证按顺序发送。
 */
public class Demo06ChannelInConcurrent {

    public static void main(String[] args) {
        final Channel channel = null;

        // 创建持有要写数据的 ByteBuf
        final ByteBuf buf = Unpooled.copiedBuffer("your data", CharsetUtil.UTF_8).retain();

        // 创建将数据写到 Channel 的 Runnable
        Runnable writer = new Runnable() {
            @Override
            public void run() {
                channel.writeAndFlush(buf.duplicate());
            }
        };

        // 获取到线程池 Executor 的引用
        ExecutorService executor = Executors.newCachedThreadPool();

        // write in one thread
        executor.execute( writer );

        // write in another thread
        executor.execute( writer );
    }
}
